package org.dcma.client.centros;

import java.util.List;

import org.dcma.client.estado.EstadoGui;
import org.dcma.client.estado.EstadoService;
import org.dcma.client.estado.EstadoServiceAsync;
import org.dcma.client.resources.Resources;
import org.dcma.client.widgets.MyDatePicker;
import org.dcma.model.Centro;
import org.dcma.model.Estado;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DecoratedPopupPanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TableListener;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.VerticalSplitPanel;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;



@SuppressWarnings("deprecation")
public class CentrosGui extends Composite {

	protected VerticalPanel main;
	//protected CentroServiceDelegate centroServiceDelegate;
	private CentroServiceAsync centroService=GWT.create(CentroService.class);
	private EstadoServiceAsync estadoService=GWT.create(EstadoService.class);
	final Grid gridCentros=new Grid(5,10);
	Boolean success=false;

	public CentrosGui() {
		generateUI();
		show_centros();
	}

	private void generateUI() {
		main=new VerticalPanel();
		main.setWidth("100%");
		/*
		 * menu
		 * Es el menu principal de la aplicacion
		 */
		final MenuBar menu=new MenuBar();		
		MenuItem nuevo=new MenuItem("Nuevo", new Command() {

			@Override
			public void execute() {				
				/*
				 * Llamar a una ventana flotante que tendra los datos basicos de un centro
				 * 
				 */
				final DialogBox nuevoCentro=new DialogBox(true);
				nuevoCentro.setWidth("600px");				

				VerticalPanel vp=new VerticalPanel();

				final Label status=new Label();				
				vp.add(status);

				vp.add(new Label("Denominacion del Centro"));				
				final TextBox denominacion=new TextBox();
				denominacion.setWidth("590px");
				vp.add(denominacion);				

				vp.add(new Label("Direccion"));
				final TextBox direccion=new TextBox();
				direccion.setWidth("590px");
				vp.add(direccion);				

				vp.add(new Label("Resolucion"));
				final TextBox resolucion=new TextBox();
				resolucion.setWidth("250px");
				vp.add(resolucion);				

				vp.add(new Label("Fecha Resolucion"));
				final MyDatePicker fechaResolucion=new MyDatePicker();
				vp.add(fechaResolucion);

				vp.add(new Label("Fecha Inicio"));
				final MyDatePicker fechaInicio=new MyDatePicker();
				vp.add(fechaInicio);

				vp.add(new Label("Estado"));
				final ListBox estados=new ListBox();
				estadoService.listEstados(new AsyncCallback<List<Estado>>() {

					@Override
					public void onFailure(Throwable caught) {
						// TODO Auto-generated method stub
						
					}

					public void onSuccess(List<Estado> result) {
						for(Estado e:result) {
							estados.addItem(e.getNombre());
						}
						
					}
				});
				vp.add(estados);
				
				HorizontalPanel hp=new HorizontalPanel();
				Button btnAceptar=new Button("Aceptar", new ClickHandler() {

					@Override
					public void onClick(ClickEvent event) {
						Centro centro=new Centro();
						centro.setDenominacion(denominacion.getValue());
						centro.setDireccion(direccion.getValue());
						centro.setResolucion(resolucion.getValue());
						centro.setFechaResolucion(fechaResolucion.getValue());
						centro.setInicio(fechaInicio.getValue());
						if(save_centro(centro)==true) {
							status.setText("agregado con exito!!!");
							show_centros();
						}else {
							status.setText("error al guardar el centro");
						}
					}

				});

				hp.add(btnAceptar);

				Button btnClose=new Button("[x] Cerrar", new ClickHandler() {

					@Override
					public void onClick(ClickEvent event) {
						nuevoCentro.hide();						
					}
				});
				hp.add(btnClose);

				hp.setCellHorizontalAlignment(btnAceptar, HasHorizontalAlignment.ALIGN_CENTER);
				hp.setCellHorizontalAlignment(btnClose, HasHorizontalAlignment.ALIGN_CENTER);
				hp.setWidth("600px");

				hp.setSpacing(5);

				vp.add(hp);
				nuevoCentro.add(vp);

				nuevoCentro.setPopupPosition(200, 200);
				nuevoCentro.setAnimationEnabled(true);
				nuevoCentro.setGlassEnabled(true);
				nuevoCentro.setText("Nuevo Centro de Conciliacion");
				nuevoCentro.show();
			}
		});

		/*
		 * Menu para las tablas del sistema
		 */
		MenuBar tablas=new MenuBar(true);
		tablas.setAnimationEnabled(true);
		tablas.setTitle("Tablas del Sistema");
		tablas.addItem(new MenuItem("Estado", new Command() {
			
			@Override
			public void execute() {
				final DialogBox nuevoEstado=new DialogBox(true);
				VerticalPanel vp=new VerticalPanel();
				vp.add(new EstadoGui());				

				Button btnClose=new Button("[x] Cerrar", new ClickHandler() {

					@Override
					public void onClick(ClickEvent event) {
						nuevoEstado.hide();						
					}
				});
				vp.add(btnClose);				
				nuevoEstado.add(vp);
				nuevoEstado.setPopupPosition(200, 200);
				nuevoEstado.setAnimationEnabled(true);
				nuevoEstado.setGlassEnabled(true);
				nuevoEstado.setText("Nuevo Centro de Conciliacion");
				nuevoEstado.show();				
			}
		}));
		/*
		 * agregamos los MenuItem
		 */
		menu.addItem(nuevo);
		menu.addItem("Tablas", tablas);
		/*
		 * vsp
		 * es el panel principal de la aplicacion
		 */
		final VerticalSplitPanel vsp=new VerticalSplitPanel();
		vsp.setSize("100%", "630px");		
		/*
		 * vp
		 * es el panel donde alojaremos el menu principal asi como
		 * la tabla de procesos
		 */
		final ScrollPanel vp=new ScrollPanel();
		vp.setSize("1600px", "300px");
		vp.setAlwaysShowScrollBars(true);

		/*
		 * gridCentros
		 * es la tabla de los centros conciliatorios
		 * Botones ha ser utilizados como cabeceras 
		 */
		final Button headNombre=new Button("Denominacion");
		final Button headDireccion=new Button("Direccion");
		final Button headDistrito=new Button("Distrito");
		final Button headProvincia=new Button("Provincia");
		final Button headDepartamento=new Button("Departamento");		
		final Button headInicio=new Button("Inicio");
		final Button headResolucion=new Button("Resolucion");
		final Button headFechaResolucion=new Button("Fecha Resolucion");

		/*
		 * Colocamos los botones creados
		 */
		gridCentros.setWidget(0, 0, new Button("ID"));
		gridCentros.setWidget(0, 1, headNombre);
		gridCentros.setWidget(0, 2, headDireccion);
		gridCentros.setWidget(0, 3, headDistrito);
		gridCentros.setWidget(0, 4, headProvincia);
		gridCentros.setWidget(0, 5, headDepartamento);
		gridCentros.setWidget(0, 6, headInicio);
		gridCentros.setWidget(0, 7, headResolucion);
		gridCentros.setWidget(0, 8, headFechaResolucion);
		gridCentros.setWidget(0, 9, new Button("Opciones"));

		/*
		 * Definimos que cada boton tenga el ancho de la columna
		 */
		headNombre.setWidth("100%");
		headDireccion.setWidth("100%");
		headDistrito.setWidth("100%");
		headProvincia.setWidth("100%");
		headDepartamento.setWidth("100%");
		headInicio.setWidth("100%");
		headResolucion.setWidth("100%");
		headFechaResolucion.setWidth("100%");		
		/*
		 * Colocamos lo creado en vp
		 */
		gridCentros.setCellSpacing(0);
		gridCentros.setCellPadding(3);
		gridCentros.ensureDebugId("gridCentros");			

		vp.add(gridCentros);

		/*
		 * tp
		 * Panel donde colocaremos los datos del proceso 
		 */
		TabPanel tp=new TabPanel();

		tp.setSize("100%", "300px");
		/*
		 * info
		 * Panel con la informacion basica del proceso
		 */
		FlexTable info=new FlexTable();			

		info.setWidget(0,0,new Label("Nombre"));
		final TextBox txtDenominacionCentro=new TextBox();
		txtDenominacionCentro.setWidth("100%");
		txtDenominacionCentro.setEnabled(false);
		info.setWidget(0,1,txtDenominacionCentro);		

		info.setWidget(1,0,new Label("Direccion"));
		final TextBox txtDireccionCentro=new TextBox();
		txtDireccionCentro.setWidth("100%");
		txtDireccionCentro.setEnabled(false);
		info.setWidget(1,1,txtDireccionCentro);

		info.setWidget(2,0,new Label("Departamento"));
		final ListBox cmbDepartamento=new ListBox();
		cmbDepartamento.setEnabled(false);
		info.setWidget(2,1,cmbDepartamento);


		info.setWidget(2,2,new Label("Provincia"));
		final ListBox cmbProvincia=new ListBox();
		cmbProvincia.setEnabled(false);
		info.setWidget(2,3,cmbProvincia);

		info.setWidget(2,4,new Label("Distrito"));
		final ListBox cmbDistrito=new ListBox();
		cmbDistrito.setEnabled(false);
		info.setWidget(2,5,cmbDistrito);

		info.setWidget(3,0,new Label("Inicio de actividades"));
		MyDatePicker fechaInicio=new MyDatePicker();			
		info.setWidget(3,1,fechaInicio);		

		info.setWidget(4,0,new Label("Resolucion"));
		TextBox txtResolucion=new TextBox();
		info.setWidget(4,1,txtResolucion);
		
		info.setWidget(4,2,new Label("Fecha Resolucion"));
		MyDatePicker fechaResolucion=new MyDatePicker();
		info.setWidget(4,3,fechaResolucion);
		
		/*
		 * Vamos a definir un cellFormatter para operar colspan en el panel info
		 */
		FlexCellFormatter cellFormatter=info.getFlexCellFormatter();
		cellFormatter.setColSpan(0, 1, 5);
		cellFormatter.setColSpan(1, 1, 5);
		/*
		 * Usuarios
		 * Panel con la lista de Integrantes
		 */
		Grid integrantes=new Grid(2,5);
		final Button headCargoIntegrante=new Button("Cargo");
		final Button headNombreIntegrante=new Button("integrante");		
		final Button headInicioLabor=new Button("Inicio");
		final Button headFinLabor=new Button("Fin");		

		integrantes.setWidget(0, 0, new Button("N"));
		integrantes.setWidget(0, 1, headCargoIntegrante);
		integrantes.setWidget(0, 2, headNombreIntegrante);
		integrantes.setWidget(0, 3, headInicioLabor);
		integrantes.setWidget(0, 4, headFinLabor);

		/*
		 * Seguimientos
		 * Pnale con la lista de Acciones o Modificaciones realizadas sobre el centro
		 */
		Grid seguimientos=new Grid(2,5);
		final Button headFechaSeguimiento=new Button("Fecha");
		final Button headAsuntoSeguimiento=new Button("Asuntos");		
		final Button headDocumentoSeguimiento=new Button("Documentos");
		final Button headEstadoSeguimiento=new Button("Estado");

		seguimientos.setWidget(0, 0, new Button("N"));
		seguimientos.setWidget(0, 1, headFechaSeguimiento);
		seguimientos.setWidget(0, 2, headAsuntoSeguimiento);
		seguimientos.setWidget(0, 3, headDocumentoSeguimiento);
		seguimientos.setWidget(0, 4, headEstadoSeguimiento);
		/*
		 * agregamos los paneles a tp
		 */
		tp.add(info, "Datos del Proceso");
		tp.add(integrantes, "Integrantes");
		tp.add(seguimientos, "Seguimientos");

		/*
		 * agregamos los paneles
		 */		
		vsp.add(vp);
		vsp.add(tp);

		/*
		 * Agregamos algunos eventos
		 * Haremos el Binding entre la tabla y el formulario
		 */
		gridCentros.addTableListener(new TableListener() {

			@Override
			public void onCellClicked(SourcesTableEvents sender, int row, int cell) {
				txtDenominacionCentro.setText( gridCentros.getWidget(row, 1).getElement().getInnerText());
				txtDireccionCentro.setText( gridCentros.getWidget(row, 2).getElement().getInnerText());
				
			}
		});
		
		main.add(menu);
		main.add(vsp);
		initWidget(main);
	}
	
	public boolean save_centro(Centro centro) {		
		centroService.addCentro(centro, new AsyncCallback<Void>() {
			
			@Override
			public void onSuccess(Void result) {
				success=true;
				
			}
			
			@Override
			public void onFailure(Throwable caught) {
				success=false;				
			}
		});
		return success;
	}
	
	public void show_message(String message) {
		final DecoratedPopupPanel simplePopup = new DecoratedPopupPanel(true);
		simplePopup.setWidth("300px");
		simplePopup.setWidget(new HTML(Resources.ICONS.album().getHTML() + "<strong>" + message + "</strong>"));
		simplePopup.show();
	}

	public void show_centros() {
		centroService.listCentros(new AsyncCallback<List<Centro>>() {

			@Override
			public void onFailure(Throwable caught) {
				show_message(caught.getMessage());				
				
			}

			@Override
			public void onSuccess(List<Centro> result) {
				list_centros(result);
			}
		});
	}
	
	public void list_centros(List<Centro> result) {
		int row=1;
		String rowStyle;
		for(Centro centro:result) {
			if(row%2==0) { rowStyle="odd"; } else { rowStyle="even"; }
			gridCentros.getRowFormatter().addStyleName(row, rowStyle);		
			gridCentros.setWidget(row, 0, new HTML("<span class='colIndex' style='width: 30px;'>" + row + "</span>"));			
			gridCentros.setWidget(row, 1, new HTML(centro.getDenominacion()));
			gridCentros.setWidget(row, 2, new HTML(centro.getDireccion()));
			gridCentros.setWidget(row, 3, new HTML(centro.getInicioString()));
			gridCentros.setWidget(row, 7, new HTML(centro.getResolucion()));
			gridCentros.setWidget(row, 8, new HTML(centro.getFechaResolucionString()));
			row++;
		}
	}
}
